package com.tbit.uqbike.webmanager.dao.core;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.tbit.config.datasource.DataSource;
import com.tbit.uqbike.object.pojo.*;
import com.tbit.uqbike.object.pojo.dto.AccountUserDTO;
import com.tbit.uqbike.object.pojo.dto.ClockInManageDTO;
import com.tbit.uqbike.object.pojo.vo.AccountUserLoginExportVO;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author MyWin E-mail:335918956@qq.com
 * @version 1.0
 * @createTime 2020-01-03 12:04
 */
@DS(DataSource.CORE)
public interface AccountUserDao {
    AccountUser getByPhone(Map<String, Object> params);

    List<Account> getAccountById(Integer accountUserId);

    /**
     * 根据 accountUserId 批量查询对应的 Account
     */
    List<Account> getAccountByUserIds(@Param("accountUserIds") List<Integer> accountUserIds);

    AccountUser getAccountUserById(Integer accountUserId);

    List<AccountUser> getAccountUserByAid(Map<String, Object> map);

    List<AccountUserDTO> getAccountUserByAids(Map<String, Object> map);

    int getAccountUserCntByAid(Map<String, Object> map);

    List<AccountUser> getAccountUserByIds(List<Integer> accountUserIds);

    /**
     * 根据角色id和账号id获取账号
     *
     * @param map
     * @return
     */
    AccountUser getAccountUserByAidAndUid(Map<String, Object> map);

    /**
     * 删除绑定关系
     *
     * @param map
     * @return
     */
    int delAndUidBound(Map<String, Object> map);

    int insertAndUidBound(Map<String, Object> map);

    int insert(AccountUser accountUser);

    int update(AccountUser accountUser);

    /**
     * 通过主键id获取
     * 理论上来说account和user是一对多关系，所以这里返回list莫名其妙
     */
    List<AccountUserBound> getByAccountUserId(Integer accountUserId);

    /**
     * 批量查询绑定关系
     */
    List<AccountUserBound> getBoundByAccountUserIds(@Param("accountUserIds") List<Integer> accountUserIds);

    /**
     * 获取区域所有运维人员
     */
    List<AccountUser> getByType(Integer accountId, Boolean flag);

    /**
     * 根据姓名和手机号检索运维人员
     */
    List<AccountUser> queryOperator(@Param("phone") String phone,@Param("name") String name);

    /**
     * 获取分区的所有运维人员
     */
    List<AccountUser> getByRegionIds(@Param("regionIds") String regionIds);

    void del(Integer accountUserId);

    /**
     * 通过accountId和accountUserId获取
     */
    AccountUserBound getByUserId(Map<String, Object> map);

    /**
     * 通过accountId和accountUserId获取客服角色
     */
    AccountUserBound getCustomer(Map<String, Object> map);

    List<Integer> getAccountIdByBrandIdAndPhoneAndName(@Param("brandId") Integer brandId,
                                                       @Param("phone") String phone,
                                                       @Param("name") String name);

    /**
     * 通用查询列表
     *
     * @param queryMap 查询条件
     * @return 结果集
     */
    List<AccountUser> listBy(Map<String, Object> queryMap);

    /**
     * 通用查询单个用户
     *
     * @param queryMap 查询条件
     * @return 结果
     */
    AccountUser getBy(Map<String, Object> queryMap);

    /**
     * 修改到期时间
     */
    void editExpire(AccountUserBound accountUserBound);

    /**
     * 根据类型获取区域旗下用户
     *
     * @param map
     * @return
     */
    List<AccountUser> getByUserType(Map<String, Object> map);

    AccountUserBound getRoleByUserId(Integer userId);

    List<AccountUser> getByAccountId(Integer accountId);


    /**
     * 查询某运营权的分区id
     */
    List<Region> getRegionId(Integer accountId);

    String getRegionName(Integer regionId);

    /**
     * 根据电话号码获取区域所有运维人员
     */
    List<AccountUser> getByTypeAndPhone(Map<String, Object> map);

    /**
     * 获取区域下的所有运维人员最后一次时间和位置
     */
    List<AccountUserLastPos> getAccountUserPointTime(Integer accountId);

    /**
     * 根据运维人员名称获取运维人员id
     *
     * @param accountUserName 运维人员名称
     * @return
     */
    List<Integer> getAccountUserIdsByName(@Param("accountUserName") String accountUserName);

    /**
     * 根据品牌id查询旗下所有加盟商和区域账号
     *
     * @param brandId 品牌id
     * @return
     */
    List<AccountUser> queryAccountUserByBrandId(@Param("brandId") Integer brandId);


    /**
     * 查询用户绑定的权限
     *
     * @param accountUserId
     * @param accountId
     * @return
     */
    AccountUserBound queryAccountUserBound(@Param("accountUserId") Integer accountUserId, @Param("accountId") Integer accountId);

    /**
     * 查询当前登录用户所有下级绑定的登录账号
     *
     * @param accountId 账户id
     * @return 所有账户绑定账号
     */
    List<AccountUserLoginExportVO> queryAccountUserByAccountId(@Param("accountId") Integer accountId, @Param("type") Integer type);

    /**
     * 获取操作人信息
     *
     * @param phone
     * @param name
     * @return
     */
    List<OpMsg> getOpMsg(@Param("phone") String phone, @Param("name") String name);

    /**
     * 批量查询用户角色信息
     *
     * @param accountUserIds 。
     * @return 。
     */
    List<AccountUser> mapUserRoleInfoByIds(@Param("accountUserIds") Set<Integer> accountUserIds);


    AccountUserBound getBoundByUserId(Integer accountUserId);

    /**
     * 获取区域内运维人员名称
     *
     * @param dto
     * @return
     */
    @MapKey("accountUserId")
    Map<Integer, Map<String, String>> getNameByAccountId(ClockInManageDTO dto);

    /**
     * 更新密码
     * @param accountUserId
     * @param password
     */
    void updatePassword(@Param("accountUserId") Integer accountUserId, @Param("password") String password);

    /**
     * 获取区域下账号id
     * @param accountId 区域id
     * @return AccountUser
     */
    List<AccountUser> getAccountByAccountId(@Param("accountId") Integer accountId);

    /**
     * 批量删除账号
     * @param accountUserList 账号id集合
     */
    void batchDel(@Param("accountUserList") List<AccountUser> accountUserList);

    /**
     * 批量修改账号角色
     * @param successList 手机号集合
     * @param subRoleType 角色id
     */
    void batchUpdateRole(@Param("successList") List<String> successList, @Param("subRoleType") Integer subRoleType);
    /**
     * 批量删除账号绑定关系
     * @param accountUserList accountUserList
     */
    void batchDelUserBound(@Param("accountUserList") List<AccountUser> accountUserList);

    /**
     * 获取账号
     * @param accountIds 区域id
     * @return List
     */
    List<AccountUser> getByAccountIds(@Param("accountIds") List<Integer> accountIds);

    /**
     * 根据手机号获取账号
     * @param phone 手机号
     * @return List
     */
    List<AccountUser> getAccountUserByPhone(@Param("phone") String phone, @Param("country") String country);

    /**
     * @description: 通过手机号码和用户id
     * @author: mo.shanyong
     * @date: 2025/2/24 17:50
     * @param: phone 手机号码
     * @param: accountUserId 用户id
     * @return: java.util.List<com.tbit.uqbike.object.pojo.OpMsg>
     */
    List<OpMsg> getOpMsgByUserIdAndPhone(@Param("phone") String phone, @Param("accountUserId") Integer accountUserId);

    /**
     * 根据手机号和姓名获取绑定账号
     */
    List<AccountUserDTO> getAccountUserListNew(@Param("accountIdList") List<Integer> accountIdList,
                                               @Param("subRoleType") Integer subRoleType,
                                               @Param("phone") String phone,
                                               @Param("name") String name);
}
